
#ifndef SERVIDOR_H_
#define SERVIDOR_H_

#include <iostream>
#include "Socket.h"
#include <string>
#include "../ui/Canvas.h"
#include "../ui/Ventana.h"
#include "HiloSimulacion.h"
#include "../parser/PersistenciaCanvas.h"
#include "../parser/CreadorCanvas.h"
#include "../parser/BuilderElementos.h"
#include "../modelo/CreadorNiveles.h"
#include "Mutex.h"
#include "../parser/ConfiguracionNivel.h"

using namespace std;

class Servidor {
private:
	int puerto;
	Socket sock;
	string misionActual;
	string objetivoActual;
	string mensajeMision;
	void iniciarEscenarioMision();
	void iniciarObjetivo();
	Canvas* canvas;
	Ventana* ventana;
	BuilderElementos* builder;
	int idClienteActual;
	int cantidadJugadores;
	unsigned int cantidadMaxJugadores;
	int cantidadPlay;
	HiloSimulacion* hiloSimulacion;
	PersistenciaCanvas* persistencia;
	CreadorCanvas* creadorCanvas;
	CreadorNiveles* creadorNivel;
	ConfiguracionNivel* configuracionNivel;
	Nivel* nivel;
	bool juegoActivo;
public:
	Mutex mutexCanvas;
	Mutex mutexPlayStop;
	Mutex mutexJugadores;
	set<int> jugadoresConectados;
	Servidor(int puerto, string mision,string objetivo);
	virtual ~Servidor();
	int iniciar();
	string obtenerMisionActual();
	string obtenerObjetivoActual();
	Canvas* getCanvas();
	Ventana* getVentana();
	int getIdActual();
	BuilderElementos* getBuilderElementos();
	int getCantidadPlay();
	void setCantidadJugadores(int cant);
	void setCantidadPlay(int cant);
	int getCantidadJugadores();
	void iniciarSimulacion();
	void detenerSimulacion();
	int getCantidadMaximaJugadores();

	HiloSimulacion* getHiloSimulacion() {
		return hiloSimulacion;
	}

	void setHiloSimulacion(HiloSimulacion* hiloSimulacion) {
		this->hiloSimulacion = hiloSimulacion;
	}

	string getMensajeMision() {
		return mensajeMision;
	}

	void setMensajeMision(string mensajeMision) {
		this->mensajeMision = mensajeMision;
	}
};

#endif /* SERVIDOR_H_ */
